package edu.qhst.user.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.qhst.user.dao.entity.User;
import edu.qhst.user.dto.UserSafeInfoDto;
import edu.qhst.user.dto.resp.UserLoginRespDto;
import edu.qhst.user.dto.resp.UserRegisterRespDto;
import jakarta.servlet.http.HttpServletRequest;

import java.util.List;

/**
 * 用户服务
 *
 * @author 加浓美式
 * @Date 2023/6/21
 */
public interface UserService extends IService<User> {
    /**
     * 申请加入社团
     *
     * @param userAccount  学号
     * @param username  姓名
     * @param userClass 班级
     * @param phone 电话号
     * @param gender 性别
     * @param email 邮箱
     * @return
     */
    UserRegisterRespDto userRegister(String userAccount, String username, String userClass, String phone, int gender, String email);

    /**
     * 管理员审核用户
     *
     * @param userId
     * @param option  1 - 通过  0 - 打回
     * @return
     */
    int userAudit(int userId, int option, String message);

    /**
     * 用户登录
     *
     * @param userAccount  用户账户
     * @param userPassword 用户密码
     * @param request
     * @return 脱敏后的用户信息
     */
    UserLoginRespDto userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 用户脱敏
     *
     * @param originUser
     * @return
     */
    UserSafeInfoDto getSafetyUser(User originUser);

    /**
     * 用户注销
     *
     * @param request
     * @return
     */
    boolean userLogout(HttpServletRequest request);

    /**
     * 根据标签查询用户
     * @param tagNameList
     * @return
     */
    List<UserSafeInfoDto> searchUsersByTags(List<String> tagNameList);



    /**
     * 更新用户信息
     * @param user
     * @param loginUser
     * @return
     */
    int updateUser(UserSafeInfoDto user, UserSafeInfoDto loginUser);


    /**
     * 获取当前用户
     * @param request
     * @return
     */
    UserSafeInfoDto getCurrentUser(HttpServletRequest request);

    /**
     * 获取当前用户
     * @param userId
     * @return
     */
    UserSafeInfoDto getUserById(Long userId);


    /**
     * 权限判断
     *   某用户登录成功，则该用户的脱敏用户信息则保存到服务端的session中，此session只匹配当前用户的请求，并返回给前端一个设置 cookie 的 ”命令“
     *   session => cookie
     *   前端接收到后端的命令后，设置 cookie，保存到浏览器内
     *   当该用户调用查询接口时，前端再次请求后端的时候（相同的域名），在请求头中带上cookie去请求
     *   服务器端则通过该用户的请求中cookie携带的JSESSIONID来匹配服务器中的session
     *   若匹配上，则通过session中的 用户登录态USER_LOGIN_STATE 再获取到脱敏用户数据
     *   最终根据脱敏用户对象（用户的登录信息、登录名等）来判断该用户的权限是否为管理员 (safetyUser.getUserRole())
     */
    boolean isAdmin(HttpServletRequest request);


    /**
     * 是否为管理员
     * @param loginUser
     * @return
     */
    boolean isAdmin(UserSafeInfoDto loginUser);


    /**
     * 获取最匹配的用户
     * @param num
     * @param loginUser
     * @return
     */
    List<UserSafeInfoDto> matchUsers(long num, UserSafeInfoDto loginUser);

    /**
     * 获取用户状态，是否合法
     * @return
     */
    List<User> searchUsersByStatus();

    /**
     * 修改密码
     * @return
     */
    boolean changePwd(String oldPwd, String newPwd, HttpServletRequest request);

    /**
     * 搜索队伍成员
     * @param TeamId
     * @return
     */
    List<Integer> selectUserIdByTeam(int TeamId);

    /**
     * 查询用户
     * @param pageSize
     * @param pageNum
     * @param request
     * @return
     */
    Page<UserSafeInfoDto> recommendUsers(long pageSize, long pageNum, HttpServletRequest request);

    List<UserSafeInfoDto> listUserInfoByIds(List<Long> userIds);
}
